package com.chenu.gamscriptman.utils;

import com.chenu.gamscriptman.compoent.Global;
import com.chenu.gamscriptman.controller.MessageController;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

import java.io.*;
import java.util.List;
import java.util.Map;

/**
 * @author flyan
 * date 2020-01-04
 * @function Execl文件工具
 */
public class ExcelUtils {

    /**
     * 通过一个数据库列表数据生成一个Execl文件
     * @param sheetName 工作页名称
     * @param title 标题栏
     * @param keyList 键列表，目的是为了按顺序拿取数据库数据
     * @param context 数据库数据
     * @return 文件真实路径，失败则为null
     */
    public static String createExeclFileByDBList(
            String sheetName,
            List<String> title,
            List<String> keyList,
            List<Map<String, Object>> context
    ) throws IOException, WriteException {

        String parentDir = Global.DOWNLOAD_PATH + "/exec";

        /* 如果父目录不存在，创建它 */
        File parentDirFile = new File(parentDir);
        if(!parentDirFile.exists()){
            if(!parentDirFile.mkdirs()){
                return null;
            }
        }

        /* 得到文件真实路径 */
        String fileName = sheetName + ".xls";
        String filePath = parentDir + "/" + fileName;
//        System.out.println("filePath --> " + filePath);
        File file = new File(filePath);

        /* 一些情况，不需要再继续 */
        if(context == null || context.size() == 0){
            return null;
        }

        /* 创建文件，如果文件创建失败则返回null */
        if(!file.exists()){
            if(!file.createNewFile())
                return null;
        } else {    /* 文件已存在的话，清空它 */
            FileWriter fileWriter =new FileWriter(file);
            fileWriter.write("");
            fileWriter.flush();
            fileWriter.close();
        }

        /* 创建Execl工作薄 */
        WritableWorkbook workbook = Workbook.createWorkbook(file);

        /* 创建工作页 */
        WritableSheet sheet = workbook.createSheet(sheetName, 0);

        Label label = null;
        /* 设置第一行为表头标题 */
        for(int i = 0; i < title.size(); i++){
            label = new Label(i, 0, title.get(i));
            sheet.addCell(label);
        }

        /* 将数据导入，它们排在标题下面 */
        for(int row = 0; row < context.size(); row++){                 /* 数据条数，进行行索引 */
            Map<String, Object> rowData = context.get(row);
            for (int col = 0; col < context.get(row).size(); col++){   /* 数据列书，进行列索引 */
                /* 添加第row行第col列，设置数据
                 * 行数 + 1 是为了跳过表头标题
                 */
                label = new Label(col, row + 1, rowData.get(keyList.get(col)) == null ? "" : rowData.get(keyList.get(col)).toString());
                sheet.addCell(label);
            }
        }

        /* 将数据写入到文件中 */
        workbook.write();

        /* 别忘了关闭工作薄 */
        workbook.close();

        /* 返回文件的真实路径 */
        return filePath;
    }

}
